package com.shortLinked.admin.common.biz.user;

import cn.hutool.core.util.StrUtil;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import static com.shortLinked.admin.common.biz.user.ColoredOutput.RED;
import static com.shortLinked.admin.common.biz.user.ColoredOutput.RESET;

/**
 * 用户信息传输过滤器
 */
@Slf4j
@RequiredArgsConstructor
public class UserTransmitFilter implements Filter {
    @Override
    @SneakyThrows
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
        System.out.println(RED+"这里是:doFilter1"+RESET);
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String username = httpServletRequest.getHeader("username");
        // 从请求报头中获取用户信息设置到用户上下文中
        if (StrUtil.isNotBlank(username)) {
            String userId = httpServletRequest.getHeader("userId");
            String realName = httpServletRequest.getHeader("realName");
            UserInfoDTO userInfoDTO = new UserInfoDTO(userId, username, realName);
            UserContext.setUser(userInfoDTO);
            //UserContext 是一个用于存储当前用户信息的上下文类
        }
        try {
            filterChain.doFilter(servletRequest, servletResponse);
            //调用过滤器链的 doFilter 方法，传递当前的 servletRequest 和 servletResponse。这将使得请求继续向下传递，经过下一个过滤器，
            // 最终到达目标资源（如 Servlet）。如果这是链中的最后一个过滤器，请求会到达实际的目标处理器。
        } finally {
            UserContext.removeUser();
            //从 UserContext 中移除当前用户信息。这样做是为了清理线程本地存储的用户信息，避免用户信息泄漏或者影响后续请求
        }
    }
}